from fastapi import FastAPI,Query
from pydantic import BaseModel
from typing import Union,List

app = FastAPI()

@app.get("/items/")
async def read_items(q: Union[str, None] = Query(default=None, min_length=3, max_length=50,pattern="^fixedquery$")): #新写法，表示可以限制参数长度
    results = {"items": [{"item_id": "Foo"}, {"item_id": "Bar"}]}
    if q:
        results.update({"q": q})
    return results


@app.get("/items1/")
async def read_items(q: Union[list, None] = Query(default=None)): #http://localhost:8000/items/?q=foo&q=bar,以list的形式存多个值
    query_items = {"q": q}
    return query_items

@app.get("/items2/")                                             #也可以理解为直接赋值是把q为none，但是query赋值是赋值其里面的
async def read_items(q: list | None = Query(default=None)): #http://localhost:8000/items/?q=foo&q=bar,以list的形式存多个值,声明类型为 list 的查询参数，如上例所示，你需要显式地使用 Query，否则该参数将被解释为请求体。
    query_items = {"q": q}
    return query_items


@app.get("/items3/")                                                     #别名，就用alias了，q就弃用  deprecated表示让文档标记为被弃用的，其实没啥用
async def read_items(q: List[int] | None = Query(default=["foo", "bar"], alias="item-query",title="Query string",deprecated=True,description="Query string for the items to search in the database that have a good match")): #当没有值的时候，默认，也可以用list，例如，List[int] 将检查（并记录到文档）列表的内容必须是整数。但是单独的 list 不会。
    query_items = {"q": q}
    return query_items
